#include <QApplication>
#include "operations_data_statistics.h"
#include "operations_management.h"
#include "mainform.h"
#include "opreatons.h"
#include "content.h"
#include "financial_income_analytics.h"
#include <QApplication>
#include <QDebug>
#include <QMessageBox>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QDir>
#include <exception>

// 日志记录函数
void logErrorToFile(const QString& errorType, const QString& errorMessage) {
    // 确保日志目录存在
    QDir logDir("logs");
    if (!logDir.exists()) {
        logDir.mkpath(".");
    }
    
    // 打开日志文件
    QString logFileName = logDir.absoluteFilePath(QString("error_log_%1.txt").arg(QDate::currentDate().toString("yyyy-MM-dd")));
    QFile logFile(logFileName);
    
    if (logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
        QTextStream out(&logFile);
        out << QString("[%1] [%2] %3\n").arg(
            QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"),
            errorType,
            errorMessage
        );
        logFile.close();
    }
}

// 全局异常处理器
void handleUnhandledException() {
    try {
        // 尝试重新抛出当前异常
        throw;
    } catch (const std::exception& e) {
        QString errorMsg = QString("Unhandled exception: %1").arg(e.what());
        qDebug() << errorMsg;
        
        // 记录到文件
        logErrorToFile("CRITICAL_EXCEPTION", errorMsg);
        
        QMessageBox::critical(nullptr, "程序错误", 
                            QString("程序遇到未处理的异常：%1\n\n程序将终止运行。详细信息已记录到日志文件中。").arg(e.what()));
    } catch (...) {
        QString errorMsg = "Unknown unhandled exception";
        qDebug() << errorMsg;
        
        // 记录到文件
        logErrorToFile("UNKNOWN_CRITICAL_EXCEPTION", errorMsg);
        
        QMessageBox::critical(nullptr, "程序错误", 
                            "程序遇到未知异常。\n\n程序将终止运行。详细信息已记录到日志文件中。");
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // 设置异常处理
    std::set_terminate(handleUnhandledException);
    
    try {
        // 使用全局命名空间中的类
        content w;
        w.show();
        
        qDebug() << "应用程序启动成功";
        
        return a.exec();
    } catch (const std::exception& e) {
        QString errorMsg = QString("Main function exception: %1").arg(e.what());
        qDebug() << errorMsg;
        
        // 记录到文件
        logErrorToFile("MAIN_EXCEPTION", errorMsg);
        
        QMessageBox::critical(nullptr, "启动错误", 
                            QString("应用程序启动失败：%1\n\n详细信息已记录到日志文件中。").arg(e.what()));
        return -1;
    } catch (...) {
        QString errorMsg = "Unknown exception in main function";
        qDebug() << errorMsg;
        
        // 记录到文件
        logErrorToFile("UNKNOWN_MAIN_EXCEPTION", errorMsg);
        
        QMessageBox::critical(nullptr, "启动错误", "应用程序启动时遇到未知错误\n\n详细信息已记录到日志文件中。");
        return -1;
    }
}
